package chisel3.experimental.hierarchy

/** Classes or traits which will be used with the [[Definition]] + [[Instance]] api should be marked
  * with the [[instantiable]] annotation at the class/trait definition.
  *
  * @example {{{
  * @instantiable
  * class MyModule extends Module {
  *   ...
  * }
  *
  * val d = Definition(new MyModule)
  * val i0 = Instance(d)
  * val i1 = Instance(d)
  * }}}
  */
class instantiable extends chisel3.internal.instantiable

/** Classes marked with [[instantiable]] can have their vals marked with the [[public]] annotation to
  * enable accessing these values from a [[Definition]] or [[Instance]] of the class.
  *
  * Only vals of the the following types can be marked [[public]]:
  *   1. IsInstantiable
  *   2. IsLookupable
  *   3. Data
  *   4. BaseModule
  *   5. Iterable/Option containing a type that meets these requirements
  *   6. Basic type like String, Int, BigInt etc.
  *
  * @example {{{
  * @instantiable
  * class MyModule extends Module {
  *   @public val in = IO(Input(UInt(3.W)))
  *   @public val out = IO(Output(UInt(3.W)))
  *   ..
  * }
  *
  * val d = Definition(new MyModule)
  * val i0 = Instance(d)
  * val i1 = Instance(d)
  *
  * i1.in := i0.out
  * }}}
  */
class public extends chisel3.internal.public
